#include "SoundLevelMeter.h"
#include "crow.h"
#include "crow/mustache.h"

#include <fstream>
#include <sstream>
#include <thread>
#include <mutex>
#include <cstdlib>

using namespace crow;

//函数声明
void processModbusData(void);
void runCrowServer(void);

//全局变量
float data;//缓存DB数据
std::mutex dataMutex; // 互斥锁
#define Software_VERSION "V1.0.0"

//主函数
int main(int argc, char* argv[]){

    std::cout << "~~~ 声 级 计 数 据 提 供 服 务 启 动 ! ! !~~~\n";

    std::thread modbusThread(processModbusData);
    std::thread crowServerThread(runCrowServer);

    // 等待线程完成
    modbusThread.join();
    crowServerThread.join();


    return 0;
}

// 模拟 Modbus 数据处理线程
void processModbusData(void) {
    std::cout << "Modbus 数据处理线程启动\n";
    
    SoundLevelMeter dev;

    dev.open("/dev/ttyS0",9600);//打开

    while (1)
    {
        dataMutex.lock();//锁定
        data=dev.get_db();
        dataMutex.unlock();//释放
        // std::cout << "now Sound Level: " << data << " dB\n";
        sleep(1);
    }
}

// Crow 服务器处理线程
void runCrowServer(void) {
    crow::SimpleApp app;

    //获取程序的路径
    std::string static_path = getenv("PWD");
    static_path= static_path+"/frontend/";

    std::cout << "路径为" << static_path << "\n";
    const char* run_path =static_path.c_str();

    //首页绑定
    CROW_ROUTE(app, "/")([](const crow::request&, crow::response& res) {
        res.set_static_file_info("frontend/index.html");
        // res.set_static_file_info("frontend/"); // 设置静态文件目录为 "frontend/"
        res.end();
    });
    CROW_ROUTE(app, "/com_set")([](const crow::request&, crow::response& res) {
        res.set_static_file_info("frontend/com_set.html");
        // res.set_static_file_info("frontend/"); // 设置静态文件目录为 "frontend/"
        res.end();
    });



    //获取分贝数据的路由
    CROW_ROUTE(app, "/api/sound-level")([](const crow::request&, crow::response& res) {
        // 锁定互斥锁
        dataMutex.lock();
        // 创建JSON对象
        crow::json::wvalue json;
        json["sound_level"] = data;
        // 设置响应内容类型为JSON
        res.add_header("Content-Type", "application/json");
        // 将JSON对象序列化为字符串并作为响应体
        res.write(json.dump());
        // 释放互斥锁
        dataMutex.unlock();
        // 结束响应
        res.end();
    });

    //获取软件版本的路由
    CROW_ROUTE(app,"/api/Software_version")([](const crow::request&, crow::response& res) {
        // 创建JSON对象
        crow::json::wvalue json;
        json["software_version"] = Software_VERSION;
        // 设置响应内容类型为JSON
        res.add_header("Content-Type", "application/json");
        // 将JSON对象序列化为字符串并作为响应体
        res.write(json.dump());
        // 结束响应
        res.end();
    });


    std::cout << "Crow 服务器线程启动\n";
    app.port(18080).run();
}
